package main

import (
	"fmt"

	"github.com/spf13/pflag"
	"github.com/spf13/viper"
)

var (
	MyConf        *viper.Viper
	ConfFileName  = "conf-1"
	ConfFiletype  = "yaml"
	ConfFilePaths = []string{"conf"}
)

type MysqlConf struct {
	Ip       string
	Port     int
	Username string
	Password string
}

func init() {
	MyConf = viper.New()

	// 设置配置文件的搜索目录
	for _, v := range ConfFilePaths {
		MyConf.AddConfigPath(v)
		// viper.AddConfigPath("/etc/appname/")
		// viper.AddConfigPath("$HOME/.appname")
	}

	// 设置配置文件的名称
	MyConf.SetConfigName(ConfFileName)

	// 设置配置文件的类型
	MyConf.SetConfigType(ConfFiletype)

	// 加载配置文件
	err := MyConf.ReadInConfig()
	if err != nil {
		fmt.Println(err.Error())
	}
}

// 通过key获取值
func viperUseDemo() {
	fmt.Printf("%s , %d , %v , %v ", MyConf.GetString(`Information.Name`),
		MyConf.GetInt(`information.age`),
		MyConf.GetBool(`information.marry`),
		MyConf.GetStringMapString(`app`),
	)
}

// 将配置文件序列化到struct
func viperToStruct() {
	var mf MysqlConf
	// 通过key解析
	err := MyConf.UnmarshalKey("mysql", &mf)

	// 直接解析
	// err := MyConf.Unmarshal(&mf)

	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(mf)
}

// 获取命令行参数
func viperForArgs() {
	// --hostAddress string   Server running address (default "127.0.0.1")
	pflag.String("host", "127.0.0.1", "Server running address")

	// --port int             Server running port (default 8080)
	pflag.Int("port", 8080, "Server running port")

	// 解析
	pflag.Parse()

	// 加载到viper对象
	_ = MyConf.BindPFlags(pflag.CommandLine)

}

func main() {
	viperToStruct()
}
